package com.gadgets.framework.common.util;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.NumberFormat;
import java.util.Locale;

/**
 * @author UncleXiu
 * @version V1.0.0
 * @data 2020-09-19
 *
 */
public class NumberFormatUtil {

    private static NumberFormat userNoFormat = null;

    private static NumberFormat Int4Format = null;

    private static NumberFormat taskNoFormat = null;

    /**
     * 格式化整形数据到6位数
     * @param seqNo 序列数
     * @return      6位字符串
     */
    public static String formatSeqNo(Integer seqNo){
        synchronized (NumberFormatUtil.class) {
            if (null == userNoFormat) {
                userNoFormat = NumberFormat.getInstance(Locale.getDefault());
                userNoFormat.setMinimumIntegerDigits(6);
                userNoFormat.setGroupingUsed(false);
            }
        }
        return userNoFormat.format(seqNo);
    }

    /**
     * 格式化整形数据到6位数
     * @param seqNo 序列数
     * @return      6位字符串
     */
    public static String format4Int(Integer seqNo){
        synchronized (NumberFormatUtil.class) {
            if (null == Int4Format) {
                Int4Format = NumberFormat.getInstance(Locale.getDefault());
                Int4Format.setMinimumIntegerDigits(4);
                Int4Format.setGroupingUsed(false);
            }
        }
        return Int4Format.format(seqNo);
    }

    /**
     * 格式化任务编号
     * @param moduelNo  所属模块
     * @param seqNo     序列号
     * @return          任务号
     */
    public static String formatSqueueNoToTask(String moduelNo, Integer seqNo){
        synchronized (NumberFormatUtil.class) {
            if (null == taskNoFormat) {
                taskNoFormat = NumberFormat.getInstance();
                taskNoFormat.setMinimumIntegerDigits(10);
                taskNoFormat.setGroupingUsed(false);
            }
        }
        return moduelNo+taskNoFormat.format(seqNo);
    }

    /**
     * 百分比格式化（保留到百万分位）
     * @param percent   百分比原值
     * @return          格式化值
     */
    public static String percentNumFormat(double percent){
        synchronized (NumberFormatUtil.class) {
            BigDecimal bigDecimal = new BigDecimal(percent);
            bigDecimal = bigDecimal.setScale(4, RoundingMode.HALF_UP);
            return bigDecimal.toString();
        }
    }

    /**
     * 数字格式化
     * @param target    目标原值
     * @param scale     精度位
     * @return          格式化值
     */
    public static double NBitNumFormat(double target, int scale){
        synchronized (NumberFormatUtil.class) {
            BigDecimal bigDecimal = new BigDecimal(target);
            bigDecimal = bigDecimal.setScale(scale, RoundingMode.HALF_UP);
            return bigDecimal.doubleValue();
        }
    }

    /**
     * 进一法将浮点型转成整型
     * @param target        目标浮点型
     * @return              结果整形
     */
    public static int roundUpForDouble(Double target){
        return (int)Math.ceil(target);
    }

}
